package com.example.util;

import java.util.Collection;
import java.util.Map;

/**
 * String工具类
 * @author Slience
 * @date 2025/7/24 10:57
 **/
public class StringUtil {

    /**
     * 判断字符串是否为null或空字符串
     * @param str 待检查的字符串
     * @return true: 为空, false: 不为空
     */
    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

    /**
     * 判断字符串是否不为null且不为空字符串
     * @param str 待检查的字符串
     * @return true: 不为空, false: 为空
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    /**
     * 判断字符串是否为null、空字符串或只包含空白字符
     * @param str 待检查的字符串
     * @return true: 为空白, false: 不为空白
     */
    public static boolean isBlank(String str) {
        if (str == null) {
            return true;
        }
        int length = str.length();
        for (int i = 0; i < length; i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断字符串是否不为null、不为空字符串且不只包含空白字符
     * @param str 待检查的字符串
     * @return true: 不为空白, false: 为空白
     */
    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    /**
     * 判断多个字符串是否都为空
     * @param strs 待检查的字符串数组
     * @return true: 都为空, false: 至少有一个不为空
     */
    public static boolean isAllEmpty(String... strs) {
        if (strs == null || strs.length == 0) {
            return true;
        }
        for (String str : strs) {
            if (isNotEmpty(str)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断多个字符串是否都不为空
     * @param strs 待检查的字符串数组
     * @return true: 都不为空, false: 至少有一个为空
     */
    public static boolean isAllNotEmpty(String... strs) {
        if (strs == null || strs.length == 0) {
            return false;
        }
        for (String str : strs) {
            if (isEmpty(str)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断对象是否为null
     * @param obj 待检查的对象
     * @return true: 为null, false: 不为null
     */
    public static boolean isNull(Object obj) {
        return obj == null;
    }

    /**
     * 判断对象是否不为null
     * @param obj 待检查的对象
     * @return true: 不为null, false: 为null
     */
    public static boolean isNotNull(Object obj) {
        return !isNull(obj);
    }

    /**
     * 判断集合是否为空
     * @param collection 待检查的集合
     * @return true: 为空, false: 不为空
     */
    public static boolean isEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * 判断集合是否不为空
     * @param collection 待检查的集合
     * @return true: 不为空, false: 为空
     */
    public static boolean isNotEmpty(Collection<?> collection) {
        return !isEmpty(collection);
    }

    /**
     * 判断Map是否为空
     * @param map 待检查的Map
     * @return true: 为空, false: 不为空
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return map == null || map.isEmpty();
    }

    /**
     * 判断Map是否不为空
     * @param map 待检查的Map
     * @return true: 不为空, false: 为空
     */
    public static boolean isNotEmpty(Map<?, ?> map) {
        return !isEmpty(map);
    }

    /**
     * 去除字符串首尾空白字符，如果为null则返回空字符串
     * @param str 待处理的字符串
     * @return 处理后的字符串
     */
    public static String trimToEmpty(String str) {
        return str == null ? "" : str.trim();
    }

    /**
     * 去除字符串首尾空白字符，如果为空则返回null
     * @param str 待处理的字符串
     * @return 处理后的字符串
     */
    public static String trimToNull(String str) {
        String result = str == null ? null : str.trim();
        return result == null || result.length() == 0 ? null : result;
    }

    /**
     * 安全的字符串比较，避免NullPointerException
     * @param str1 字符串1
     * @param str2 字符串2
     * @return 是否相等
     */
    public static boolean equals(String str1, String str2) {
        return str1 == null ? str2 == null : str1.equals(str2);
    }

    /**
     * 忽略大小写的字符串比较
     * @param str1 字符串1
     * @param str2 字符串2
     * @return 是否相等
     */
    public static boolean equalsIgnoreCase(String str1, String str2) {
        return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2);
    }
}
